Skip to main content

Fonctions G-Code spécifiques à l'utilisateur

Le CNC11_CustomFunctions.project un exemple de projet se trouve dans le répertoire d'installation de CODESYS sous ..\CODESYS SoftMotion\Examples.

Cet exemple montre comment créer vos propres fonctions à utiliser dans des expressions en G-code.

Pour plus d'informations sur les expressions et les fonctions du code G, consultez : Expressions. Vous y trouverez une liste de tous les opérateurs et fonctions pris en charge par défaut.

L'exemple définit SEL opérateur de la norme IEC 61131-3 afin qu'il puisse également être utilisé en code G.

Structure de la demande

Comme d'habitude pour les applications CNC, l'application consiste en un traitement de trajectoire (CNC_PreparePath programme) et interpolation (CNC programme). Comme l'interpolation ne diffère pas des autres exemples, le sujet ne sera pas abordé plus

Le traitement des chemins est appelé cycliquement toutes les 20 ms en basse priorité PathTask. L'interpolation est appelée cycliquement toutes les 4 ms MotionTask. La tâche d'arrière-plan VISU_TASK est défini pour la visualisation.

Dans la visualisation, vous pouvez commencer à traiter le code G et définir la valeur de la variable $LONGLINE$. Le code G et le mouvement de la machine (portique 3D) sont affichés sur le côté droit de la visualisation

Le code G

CNC

LET #WIDTH : LREAL
N10 G36 O#WIDTH D SEL($LONGLINE$, 40, 110)
N20 F50 E100 E-100
N30 G01 X#WIDTH Y#WIDTH Z#WIDTH/2
N40 Y-#WIDTH
N50 X-#WIDTH Z-#WIDTH/2
N60 Y#WIDTH
N70 X0 Y0 Z0

Ligne 1 : Déclaration de la variable locale #WIDTH de type LREAL.

Ligne 2, bloc N10 : Affectation de la valeur de SEL($LONGLINE$, 40, 110) à la variable #WIDTH. Si la valeur de la variable PLC $LONGLINE$ est TRUE, alors la valeur de l'expression est 110 ; sinon elle est 40.

Dans les lignes suivantes, un rectangle avec un mouvement supplémentaire dans la direction Z est parcouru ; la longueur d'un côté du rectangle est 2*#WIDTH.

Mise en œuvre de la SEL fonction

_sm_img_function_sel.png

Pour créer une fonction définie par l'utilisateur, vous devez écrire un bloc de fonction qui implémente le SMC_NC_IFunction interface.

Pour plus d'informations, voir : Fonction SMC_NC_I.

. L'interface définit deux méthodes :
  1. GetSignature. Le type de retour, le nombre et les types d'arguments de la fonction sont renvoyés ici. Dans cet exemple, SEL la fonction renvoie une valeur de type T_OTHER et possède 3 arguments de type T_BOOL, T_OTHER, et T_OTHER. T_OTHER représente n'importe quel type (soit T_BOOL, T_LREAL, ou T_STRING]. Les 3 occurrences de T_OTHER doit être du même type.

    METHOD GetSignature
    VAR_OUTPUT
        resultType : SMC_GVar_Type;
        nNumArguments : UDINT;
        pType : POINTER TO SMC_GVar_Type;
    END_VAR
    VAR    argTypes : ARRAY[0..2] OF SMC_GVar_Type :=
            [SMC_GVar_Type.T_BOOL,
             SMC_GVar_Type.T_OTHER,
             SMC_GVar_Type.T_OTHER];
    END_VAR
    
    resultType := SMC_GVAR_Type.T_OTHER;
    nNumArguments := 3;
    pType := ADR(argTypes);
  2. Call: Cette méthode est appelée lorsque le code G est en cours de traitement. Les arguments sont transmis via pa entrée. L'expression pa[0].argValue.bValue est utilisé pour accéder à la valeur booléenne du premier argument. En fonction du type du deuxième argument pa[1].argType, le résultat est la valeur de retour result.argType et le branchement vers une instruction CASE.

    METHOD Call
    VAR_IN_OUT
        result : SMC_NC_GArgument;
    END_VAR
    VAR_INPUT
        pa : POINTER TO SMC_NC_GArgument;
    END_VA
    RVAR_OUTPUT
        eError : SMC_ERROR;
    END_VAR
    VAR
        g : BOOL;
    END_VAR
    
    g := pa[0].argValue.bValue;
    
    result.argType := pa[1].argType;
    
    CASE result.argType OF
    SMC_GVAR_Type.T_BOOL:
        result.argValue.bValue := SEL(g, pa[1].argValue.bValue, pa[2].argValue.bValue);
    
    SMC_GVAR_Type.T_STRING:
        result.argValue.sValue := SEL(g, pa[1].argValue.sValue, pa[2].argValue.sValue);
    
    SMC_GVAR_Type.T_LREAL:
        result.argValue.fValue := SEL(g, pa[1].argValue.fValue, pa[2].argValue.fValue);
    
    ELSE
        eError := SMC_INVALID_PARAMETER;
    END_CASE

Configuration de SMC_ReadNCFile2

Une instance de CNC_Sel le bloc de fonction est créé dans le GVL_CNCFunctions liste globale de variables.

Un tableau aCNCFunctions de longueur 1 est initialisée avec le nom et l'instance du bloc fonctionnel. Ce tableau est ensuite lié dans le tableau funTable de type SMC_NC_GFunctionTable.

aCNCFunctions : ARRAY[0..0] OF SMC_NC_GFunction :=
    [(stName:= 'SEL', iFunc:= GVL_CNCFunctions.g_Sel)];

funTable : SMC_NC_GFunctionTable :=
    (numFunctions:= 1,     pFunction:= ADR(aCNCFunctions)) ;

Enfin, ce tableau est transmis au SMC_ReadNCFile2 bloc fonctionnel :

rncf2 : SMC_ReadNCFile2 := (bParenthesesAsComments:= FALSE);

[...]

rncf2(
    bExecute:= TRUE,
    sFileName:= sFileName,
    pCustomFunTable:= ADR(funTable),
    pvl:= ADR(varList));

Mise en service

  1. Créez l'application et téléchargez-la sur une manette.

  2. Démarrez l'application, passez à la visualisation et appuyez sur Start. Vous pouvez utiliser Longline bouton radio pour définir la valeur de la variable $LONGLINE$ dans le code G pour TRUE ou FALSE.